
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>

using namespace std;

class Tool
{
public:

    static bool SetNonBlock(int fd)
    {
        int fl = fcntl(fd, F_GETFL);
        if(fl < 0) return false;
        fcntl(fd, F_SETFL, fl | O_NONBLOCK);
        return true;
    }


    static bool setDaemon() 
    {
        // 创建子进程，父进程退出，子进程继续执行
        pid_t pid = fork();
        if (pid < 0) 
        {
            // 创建子进程失败
            return false;
        } 
        else if (pid > 0) 
        {
            // 父进程退出
            exit(0);
        }

        // 创建新的会话，脱离控制终端
        setsid();

        // 修改当前工作目录
        chdir("/");

        // 关闭标准输入、输出、错误流
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        // 重定向标准输入、输出、错误流到 /dev/null
        open("/dev/null", O_RDONLY);
        open("/dev/null", O_WRONLY);
        open("/dev/null", O_WRONLY);

        return true;
    }


    static void daemond()
{
    //父进程创建子进程,然后退出,形式上脱离控制终端
    pid_t pid = fork();
    if(pid > 0)
    {
        exit(0);
    }
 
    //子进程创建一个新的会话
    //setsid();
    //改变当前目录为根目录
    chdir("./");
    //设置umask掩码,防止从父进程继承的过来的屏蔽字拒绝某些权限
    //umask(0);
    //关闭文件描述符,节省系统资源
    //STDIN_FILENO就是标准输入设备（一般是键盘）的文件描述符
    //写入/dev/null的东西会被系统丢掉
    close(STDIN_FILENO);
    //再一次的保护
    open("/dev/null",O_RDWR);
    dup2(0,1);
    dup2(0,2);
    //守护进程的核心逻辑
    //退出
}




}; 